package com.fjl.array.leetcode1004;

/**
 * @Description
 * @Author: 01195
 * @Date: 2025/3/21 14:58
 */
/*
给定一个二进制数组 nums 和一个整数 k，假设最多可以翻转 k 个 0 ，则返回执行操作后 数组中连续 1 的最大个数 。
示例 1：
    输入：nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
    输出：6
    解释：[1,1,1,0,0,1,1,1,1,1,1]
    粗体数字从 0 翻转到 1，最长的子数组长度为 6。
示例 2：
    输入：nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
    输出：10
    解释：[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
    粗体数字从 0 翻转到 1，最长的子数组长度为 10。
使用滑动窗口算法需要搞清楚以下几个问题：
1、什么时候应该扩大窗口？
2、什么时候应该缩小窗口？
3、什么时候得到一个合法的答案？
针对本题，以上三个问题的答案是：
1、当窗口里面0的个数小于k
2、当窗口里面0的个数大于k
3、当窗口里面0的个数等于k,计算子数组的长度
 */
public class Clazz {
    public int longestOnes(int[] nums, int k) {
        int count = Integer.MIN_VALUE;
        int left = 0, right = 0;
        int window = 0; // 记录窗口中0的个数
        while (right < nums.length) {
            if (nums[right] == 0) {
                window++;
            }
            right++;
            while (window > k && left < right) {
                if (nums[left] == 0) {
                    window--;
                }
                left++;
            }
            // 这个时候window里面肯定是k个0，其他的都是1
            count = Math.max(count, right - left);
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(new Clazz().longestOnes(new int[]{0,0,0,1}, 4));
    }
}
